var express = require('express');
var router = express.Router();

const md5 = require('blueimp-md5')
const {UserModel, ChatModel} = require('../db/models')

/* 查询的时候过滤的属性  __v 是mongoDB自带的  用不到  */
const filter = {password: 0, __v: 0}


/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});


// 注册一个路由用于用户注册
/*
* a) path 为register
* */
/*router.post('/register', function(req, res){
  // 1.获取请求参数
  const {username, password} = req.body
  // 2.处理
  if (username == 'admin') { // 注册会是失败
    // 返回响应数据(失败)
    res.send({code:1, msg:'此用户已存在'})
  } else { // 注册会成功
    // 返回响应数据(成功)
    res.send({code:0, data:{id:'abc23', username, password}})
  }
  // 返回响应数据

})*/


/*路由模块*/
// 注册的路由
router.post('/api/register', function(req, res){
  // 读取请求参数
  const {username, password, type} = req.body
  // 处理
    // 判断用户是否已经存在  存在则返回错误的提示信息
  // 根据username 查询
  UserModel.findOne({username}, function (error, user) {
    // 如果user 有值  则存在
    if (user) {
      // 返回错误信息
      res.send({code: 1, msg: '次用户已存在'})
    } else {
      // 不存在  则保存
      new UserModel({username, type, password: md5(password)}).save(function(error, user) {
        // 返回响应数据  包含user的jason数据
        // 密码不要返回  自己封装数据
        const data = {username, type, _id:user._id}
        // 生成一个cookie(userid:user_id), 并且交给浏览器保存  一一周免登陆
        res.cookie('userid', user._id, {maxAge: 1000*60*60*24*7})
        res.send({code: 0, data})
      })
    }
  })
})

// 登录的路由
router.post('/api/login', function(req, res) {
  const {username, password} = req.body
  // 根据username和password查询数据库users  集合
  // 如果没有  则返回提示错误的信息,  如果有, 则返回登录成功的信息
  UserModel.findOne({username, password: md5(password)}, filter, function (error, user) {
    if (user) {
      // 登录成功
      res.cookie('userid', user._id, {maxAge: 1000*60*60*24*7})
      // 返回
      res.send({code: 0, data: user})
    } else {
      // 登录失败
      res.send({code: 1, msg: '用户名或密码不正确'})
    }
  })

})

// 更新用户信息的路由   需要根据 _id  来更新mongoDB中的用户信息
router.post('/api/update', function (req, res) {
  // 从请求的cookie中得到userid
  const userid = req.cookies.userid
  // 如果不存在,则直接返回一个提示信息
  if (!userid) {
    return res.send({code: 1, msg: '请先登录'})
  }
  // r如果存在userid ,那么根据userid更新对应的user
  // 得到用户提交的数据
  const user = req.body   // 这里面获取的user是没有_id
  UserModel.findByIdAndUpdate({_id: userid}, user, function (error, oldUser) {
    if (!oldUser) {
      // cokkie 里面的userid是没用的
      // 通知浏览器  删除cookies里面的userid
      res.clearCookie('userid')
      // 返回一个提示信息
      res.send({code: 1, msg: '请先登录'})
    } else {
      // user 缺少  _id, username, type  这三个属性
      const {_id, username, type} = oldUser
      // 将多个对象合并成一个对象,这样可以返回给调用者更新之后的完整的数据
      const data = Object.assign(user, {_id, username, type})
      // 返回数据
      res.send({code: 0, data: data})
    }
  })

})

// 获取用户信息的路由(根据cookie中的userid)
router.get('/api/user', function(req, res) {
  // 从请求的Cookie中得到userid
  const userid = req.cookies.userid
   // 如果不存在,则直接返回一个提示信息
  if (!userid) {
    return res.send({code: 1, msg: '请先登录'})
  }
  // 根据userid查询对应的user
  UserModel.findOne({_id:userid}, filter,function (error, user){
    res.send({code:0, data: user})
  })
})

// 获取用户列表(根据用户类型)
router.get('/api/userlist', function (req, res) {
  const {type} = req.query
  UserModel.find({type}, filter, function (error, users) {
    res.send({code: 0, data:users})
  })
})




/*
获取当前用户所有相关聊天信息列表
 */
router.get('/api/msglist', function (req, res) {
  // 获取cookie中的userid
  const userid = req.cookies.userid
  // 查询得到所有user文档数组
  UserModel.find(function (err, userDocs) {
    // 用对象存储所有user信息: key为user的_id, val为name和header组成的user对象
    /*const users = {} // 对象容器
    userDocs.forEach(doc => {
      users[doc._id] = {username: doc.username, header: doc.header}
    })*/

    /* 累加 */
    const users = userDocs.reduce((users, user) => {
      users[user._id] = {username: user.username, header: user.header}
      return users
    } , {})
    /*
    查询userid相关的所有聊天信息  :  我发的   和  发给我的
     参数1: 查询条件
     参数2: 过滤条件
     参数3: 回调函数
    */
    ChatModel.find({'$or': [{from: userid}, {to: userid}]}, filter, function (err, chatMsgs) {
      // 返回包含所有用户和当前用户相关的所有聊天消息的数据
      //  users 是 对象   chatMsgs  是 数组类型
      res.send({code: 0, data: {users, chatMsgs}})
    })
  })
})

/*
* 修改指定消息为已读
* 因为要修改数据库里面的数据,所以使用的请求是POST
 */
router.post('/api/readmsg', function (req, res) {
  // 得到请求中的from和to
  const from = req.body.from
  const to = req.cookies.userid
  /*
  更新数据库中的chat数据
  参数1: 查询条件
  参数2: 更新为指定的数据对象
  参数3: 是否1次更新多条, 默认只更新一条
  参数4: 更新完成的回调函数
   */
  ChatModel.update({from, to, read: false}, {read: true}, {multi: true}, function (err, doc) {
    console.log('/api/readmsg', doc)
    res.send({code: 0, data: doc.nModified}) // 更新的数量
  })
})















module.exports = router;
